from langchain_core.prompts import ChatPromptTemplate


write_step1_template_c = ChatPromptTemplate.from_template(
"""
# 角色
你是一个文献综述的引言编写助手

# 背景
- 用户有一个需求,需要编写一份调研综述,这篇综述是对多个方法的对比分析综述,你负责编写这份综述的引言部分
- 这篇综述的结构应该是引言->对比历史成果->对比研究现状->对比领域中的实际应用->总结与结论
- 你只需要负责引言部分,所以不要写总结性的话语,用完整的几个段落来写,不要一句话一个段落,不要分条列举!


# 引言编写要求
- 首先需要介绍概念的背景、重要性和研究的动机,阐明该主题在技术或学术领域中的地位,在这一部分,你需要引用30篇论文,用户会给你提供15篇有关于这个概念的研究背景的论文片段,以及15篇关于这个概念在技术或学术领域中的地位的论文片段,你需要从中挑选你认为最贴近主题的论文来引用
- 然后描述本篇综述的总体思路和结构,以便后续引出正文
- 在引用论文时,对论文内容进行总结和逻辑推理,不要直接使用原文,并且需要注意前后逻辑连贯性!

# 用户需求
- {user_input}

# 基础定义相关的论文片段
- {background_paper}

# 概念在技术或学术领域中的地位的论文片段
- {importance_paper}

# 输出格式
- 输出markdown格式的一篇文献综述的引言
- 如果你引用了某篇论文,那么你需要在引用相关的语句后面加上一个特定格式的字符串"<sup>paper_title***chunk_id***year</sup>"来表示引用,paper_title是我给你提供的论文片段中的'paper_title'对应的值,chunk_id是我给你提供的论文片段中的'chunk_id'对应的值, year是我给你提供的论文片段中的'year'对应的值
- 你需要用'## 引言'作为开头,不要输出多余内容!
- 注意!你负责编写的是引言部分,所以不可以写"综上所述"等总结性语句

示例：
## 引言
机器学习是一种计算机算法程序<sup>Octavius: Mitigating Task Interference in MLLMs Via LoRA-MoE***1***2024</sup>,它的诞生开始于上世纪40年代<sup>MM1: Methods, Analysis Insights from Multimodal LLM Pre-training***0***2024</sup>

引用数量非常重要,必须达标!开始任务!
"""
)


write_step2_template_c = ChatPromptTemplate.from_template(
"""
# 角色
- 你是一个文献综述续写助手

# 背景
- 用户有一个需求,需要编写一份调研综述,这篇综述是对多个方法的对比分析综述,你负责编写这份综述的对比历史成果部分
- 这篇综述的结构应该是引言->对比历史成果->对比研究现状->对比领域中的实际应用->总结与结论
- 你只需要负责续写对比历史成果部分,所以不要写总结性的话语,用完整的几个段落来写,不要一句话一个段落,不要分条列举!


# 对比历史成果部分要求
- 首先需要引用论文介绍这项技术的历史成果,并且简要对比各种方法之间的区别
- 注意!在这一部分,你需要引用20篇论文,用户会给你提供20篇有关于这个技术的历史成果的论文片段,你需要从中挑选你认为最贴近主题的论文来引用
- 在引用论文时,对论文内容进行总结和逻辑推理,不要直接使用原文,并且需要注意前后逻辑连贯性
- 注意!你负责编写的只是基本原理部分,所以不可以写"综上所述"等总结性语句

# 用户需求
- {user_input}

# 已经写好的引言部分
- {step1_c}

# 历史成果相关的论文片段
- {present_work_paper}

# 输出格式
- 输出markdown格式的一篇文献综述
- 如果你引用了某篇论文,那么你需要在引用相关的语句后面加上一个特定格式的字符串"<sup>paper_title***chunk_id***year</sup>"来表示引用,paper_title是我给你提供的论文片段中的'paper_title'对应的值,chunk_id是我给你提供的论文片段中的'chunk_id'对应的值, year是我给你提供的论文片段中的'year'对应的值
- 在输出时,你只需要输出你写的这一章节的内容,你需要用'## 历史成果'作为开头,不要输出多余内容!
- 注意!你不可以写综上所述等总结性的语句,否则会导致整篇文章结构混乱!

示例：
## 历史成果
机器学习是一种计算机算法程序<sup>Octavius: Mitigating Task Interference in MLLMs Via LoRA-MoE***1***2024</sup>,它的诞生开始于上世纪40年代<sup>MM1: Methods, Analysis Insights from Multimodal LLM Pre-training***0***2024</sup>

引用数量非常重要,必须达标!开始任务!
"""
)


write_step3_template_c = ChatPromptTemplate.from_template(
"""
# 角色
- 你是一个文献综述续写助手

# 背景
- 用户有一个需求,需要编写一份调研综述,这篇综述是对多个方法的对比分析综述,你负责编写这份综述的对比研究现状部分
- 这篇综述的结构应该是引言->对比历史成果->对比研究现状->对比领域中的实际应用->总结与结论
- 你只需要负责续写对比研究现状部分,所以不要写总结性的话语,用完整的几个段落来写,不要一句话一个段落,不要分条列举!

# 对比研究现状部分编写要求
- 引用论文详细介绍这个主题的研究现状,分模块介绍不同方法、技术、算法的特点
- 然后比较不同方法、技术或算法,分析优劣势以及如何根据具体问题选择合适的方法.
- 注意!在这一部分,你需要引用20篇论文,用户会给你提供20篇有关于这个技术的研究现状的论文片段,你需要从中挑选你认为最贴近主题的论文来引用
- 在引用论文时,对论文内容进行总结和逻辑推理,不要直接使用原文,并且需要注意前后逻辑连贯性

# 用户需求
- {user_input}

# 研究现状的论文片段
- {related_work_paper}

# 输出格式
- 输出markdown格式的一篇文献综述
- 如果你引用了某篇论文,那么你需要在引用相关的语句后面加上一个特定格式的字符串"<sup>paper_title***chunk_id***year</sup>"来表示引用,paper_title是我给你提供的论文片段中的'paper_title'对应的值,chunk_id是我给你提供的论文片段中的'chunk_id'对应的值, year是我给你提供的论文片段中的'year'对应的值
- 在输出时,你只需要输出你写的这一章节的内容,你需要用'## 研究现状'作为开头,不要输出多余内容!
- 注意!你不可以写综上所述等总结性的语句,否则会导致整篇文章结构混乱!

示例：
## 研究现状
机器学习是一种计算机算法程序<sup>Octavius: Mitigating Task Interference in MLLMs Via LoRA-MoE***1***2024</sup>,它的诞生开始于上世纪40年代<sup>MM1: Methods, Analysis Insights from Multimodal LLM Pre-training***0***2024</sup>

引用数量非常重要,必须达标!开始任务!
"""
)




write_step4_template_c = ChatPromptTemplate.from_template(
"""
# 角色
- 你是一个文献综述续写助手

# 背景
- 用户有一个需求,需要编写一份调研综述,这篇综述是对多个方法的对比分析综述,你负责编写这份综述的对比领域中的实际应用部分
- 这篇综述的结构应该是引言->对比历史成果->对比研究现状->对比领域中的实际应用->总结与结论
- 你只需要负责续写对比领域中的实际应用部分,所以不要写总结性的话语,用完整的几个段落来写,不要一句话一个段落,不要分条列举!

# 对比领域中的实际应用部分编写要求
- 需要列举实际应用中的例子,展示这些方法如何被广泛应用于不同的领域,并且对比其特点和技术路线
- 注意!在这一部分,你需要引用20篇论文,用户会给你提供20篇有关于这个技术的实际应用的论文片段,你需要从中挑选你认为最贴近主题的论文来引用
- 在引用论文时,对论文内容进行总结和逻辑推理,不要直接使用原文,并且需要注意前后逻辑连贯性

# 用户需求
- {user_input}

# 实际应用的论文片段
- {application_paper}

# 输出格式
- 输出markdown格式的一篇文献综述
- 如果你引用了某篇论文,那么你需要在引用相关的语句后面加上一个特定格式的字符串"<sup>paper_title***chunk_id***year</sup>"来表示引用,paper_title是我给你提供的论文片段中的'paper_title'对应的值,chunk_id是我给你提供的论文片段中的'chunk_id'对应的值, year是我给你提供的论文片段中的'year'对应的值
- 在输出时,你只需要输出你写的这一章节的内容,你需要用'## 实际应用'作为开头,不要输出多余内容!
- 注意!你不可以写综上所述等总结性的语句,否则会导致整篇文章结构混乱!

示例：
## 实际应用
机器学习是一种计算机算法程序<sup>Octavius: Mitigating Task Interference in MLLMs Via LoRA-MoE***1***2024</sup>,它的诞生开始于上世纪40年代<sup>MM1: Methods, Analysis Insights from Multimodal LLM Pre-training***0***2024</sup>

引用数量非常重要,必须达标!开始任务!
"""
)


write_step5_template_c = ChatPromptTemplate.from_template(
"""
# 角色
- 你是一个文献综述续写助手

# 背景
- 用户有一个需求,需要编写一份调研综述,这篇综述是对多个方法的对比分析综述,你负责编写这份综述的总结与结论部分
- 这篇综述的结构应该是引言->对比历史成果->对比研究现状->对比领域中的实际应用->总结与结论
- 你只需要负责续写总结与结论,用完整的段落来写,不要一句话一个段落,不要分条列举!

# 总结与结论编写要求
- 用一段话回顾并总结在综述中讨论的关键内容

- {user_input}

# 已经写好的综述部分
- {finished_work}

# 输出格式
- 输出markdown格式的一段文献综述总结
- 在输出时,你只需要输出你写的这一章节的内容,你需要用'## 总结与结论'作为开头


引用数量非常重要,必须达标!开始任务!
"""
)

check_template = ChatPromptTemplate.from_template(
"""
# 角色
- 你是一个文献综述内容检查助手

# 背景
- 用户有一个需求,需要编写一份调研综述,你负责检查这份综述的{aim}部分
- 你收到的是一篇还没有写完的综述
- 这篇综述的结构应该是引言->基本原理与发展历程->关键技术和衍生技术->实际应用举例->挑战与未来发展方向->总结与结论


# 检查要求
- 你需要检查这份综述的{aim}部分,以及之前的模块是否完整,例如当你在检查关键技术和衍生技术这个模块的时候发现文章缺少了引言模块,那么这篇文章就不符合要求了
- 你需要检查正文中的引用文献编号是否是连续的
- 你需要检查文章最后的[参考文献列表]是否缺失,并且内容是否符合格式要求
- 在正文中,如果你用了某篇论文,那么需要在引用相关的语句后面用一个特定格式的字符串<sup>标号</sup>来表示,标号是一个整数数字,一篇综述的标号从1开始依次递增,你需要进行检查
- [参考文献列表]的格式是'citation_id': xxx, 'paper_id':xxx, 'paper_title':xxx, 'chunk_id': xxx
- [参考文献列表]的格式示例：
[参考文献列表]
'citation_id': 1, 'paper_id':'6516338d3fda6d7f065e50d0', 'paper_title':'Resisting Backdoor Attacks in Federated Learning Via Bidirectional Elections and Individual Perspective', 'chunk_id': 6
'citation_id': 2, 'paper_id':'655d674d939a5f4082e02457', 'paper_title':'MultiDelete for Multimodal Machine Unlearning', 'chunk_id': 5
- 允许重复引用文献,你只需要检查引用编号是否连续,引用内容不需要检查.允许[参考文献列表]中的citation_id引用相同的paper_id,你不需要检查重复引用!

# 综述原文
- {article}

# 输出格式
输出一个字符串,该字符串的第一个字符只能是"0"或"1"
"0"表示这篇文章通过了检查
"1"标示值这篇综述没有通过检查
其他字符解释为啥没有通过检查,给出思考过程
不要输出多余的内容!
引用数量非常重要,必须达标!开始任务!
"""
)

